﻿#pragma once
#include "headers.h"
#include "Gwiazda.h"


//#################################################################################################################
//                   konstruktor wieloparametryczny - wczytanie tekstury
//#################################################################################################################
Gwiazda::Gwiazda(FLOAT Radius, float fDistance, char* nazwa, 
				 char* nazwaPlanety, char* srednicaBiegunowa, char* odlegloscOdSlonca) :
				 ObiektSferyczny(  20, 20, fDistance, nazwaPlanety, srednicaBiegunowa, odlegloscOdSlonca)
{
	 g_pMesh = NULL;			//siatka obiektu 
	 g_pMeshMaterials = NULL;	//materia³ siatki 
	 g_pMeshTextures = NULL;	//tekstury siatki 
	 g_dwNumMaterials = 0L;		//liczba tekstur siatki 

	fSpin = 0.0f;


		LPD3DXBUFFER pD3DXMtrlBuffer; 
	//wczytaj siatkê 
	 D3DXLoadMeshFromX(nazwa, D3DXMESH_SYSTEMMEM, g_pd3dDevice , NULL, &pD3DXMtrlBuffer, NULL, &g_dwNumMaterials, &g_pMesh ) ;
 
	//skopiuj materia³y i tekstury 
	D3DXMATERIAL* d3dxMaterials = 
	(D3DXMATERIAL*) pD3DXMtrlBuffer -> GetBufferPointer(); 
	g_pMeshMaterials = new D3DMATERIAL9[g_dwNumMaterials]; 
	g_pMeshTextures = new LPDIRECT3DTEXTURE9[g_dwNumMaterials]; 
 
	for ( DWORD i=0; i < g_dwNumMaterials; i++ ) 
	{ 
		//kopiuj materia³ 
		g_pMeshMaterials[i] = d3dxMaterials[i].MatD3D; 
 
		//ustaw kolor 
		g_pMeshMaterials[i].Ambient = g_pMeshMaterials[i].Diffuse; 
 
		 D3DXCreateTextureFromFile( g_pd3dDevice , d3dxMaterials[i].pTextureFilename, &g_pMeshTextures[i] ) ;
	}


 //#############################################################################################################
//#############################################################################################################
 //#############################################################################################################
//#############################################################################################################


	 //D3DXCreateTextureFromFile(g_pd3dDevice, "ogon.png", &dymTex);

	 D3DXCreateTextureFromFileEx(g_pd3dDevice, "plik.png", D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, NULL, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, D3DCOLOR_XRGB(32, 23, 23), NULL, NULL, &dymTex);


	 //czasteczki[0].UstawKordy(3,3,3);
	 //czasteczki[1].UstawKordy(3,3,-3);
	 //czasteczki[2].UstawKordy(3,-3,3);
	 //czasteczki[3].UstawKordy(3,-3,-3);
	 //czasteczki[4].UstawKordy(-3,3,3);
	 //czasteczki[5].UstawKordy(-3,3,-3);
	 //czasteczki[6].UstawKordy(-3,-3,3);
	 //czasteczki[7].UstawKordy(-3,-3,-3);
	 czasteczki[0].UstawKordy(5,5,0);
	 czasteczki[1].UstawKordy(5,-5,0);
	 czasteczki[2].UstawKordy(-5,5,0);
	 czasteczki[3].UstawKordy(-5,-5,0);
	 czasteczki[4].UstawKordy(0,5,5);
	 czasteczki[5].UstawKordy(0,5,-5);
	 czasteczki[6].UstawKordy(0,-5,5);
	 czasteczki[7].UstawKordy(0,-5,-5);
	 czasteczki[8].UstawKordy(5,0,5);
	 czasteczki[9].UstawKordy(5,0,-5);
	 czasteczki[10].UstawKordy(-5,0,5);
	 czasteczki[11].UstawKordy(-5,0,-5);
	 czasteczki[12].UstawKordy(0,0,6);
	 czasteczki[13].UstawKordy(0,0,-6);
	 czasteczki[14].UstawKordy(6,0,0);
	 czasteczki[15].UstawKordy(-6,0,0);
	 czasteczki[16].UstawKordy(0,6,0);
	 czasteczki[17].UstawKordy(0,-6,0);
	 


 //#############################################################################################################
//#############################################################################################################
 //#############################################################################################################
//#############################################################################################################



	//zwolnij "pomoc bufora" 
	pD3DXMtrlBuffer->Release(); 
	 
}

//#################################################################################################################
//                   konstruktor bezparametryczny
//#################################################################################################################
Gwiazda::Gwiazda(void)
{
}

//#################################################################################################################
//                   destruktor
//#################################################################################################################
Gwiazda::~Gwiazda(void)
{
	Mesh->Release();
}

//#################################################################################################################
//                   reprezentacja wirtualnej metody odpowiadaj¹cej za transformacje
//#################################################################################################################
 D3DXMATRIX Gwiazda::przeksztalc(bool bOrbitOn, float fSpeedModifier, float fElpasedTime)
{
	if( bOrbitOn == true ) // jeœli ruch po orbicie jest za³¹czony to dodaj sta³¹ wartoœæ do obrotu
        fSpin += fSpeedModifier * (fElpasedTime *10.0f);

	// utwórz odpowiednie macierze transformacji
	D3DXMatrixRotationY( &mSpinRotation, D3DXToRadian( fSpin ) );
    D3DXMatrixScaling( &mScale, 5.0f, 5.0f, 5.0f );

	// z³o¿enie transformacji
	mMatrix = mScale *       // 1. Skala rozmiaru S³oñca
                 mSpinRotation; // 2. rotacja wed³ug osi


	g_pd3dDevice ->SetTransform( D3DTS_WORLD, &mMatrix );
	return mMatrix;
}



 //#############################################################################################################
//#############################################################################################################
 //#############################################################################################################
//#############################################################################################################
 void Gwiazda::RysujDym()
 {
	
	   (g_pd3dDevice)->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
	   (g_pd3dDevice)->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
       (g_pd3dDevice)->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
       (g_pd3dDevice)->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );

  //     (g_pd3dDevice)->SetVertexShader(NULL);
  //     (g_pd3dDevice)->SetPixelShader(NULL);
       (g_pd3dDevice)->SetTexture(1, NULL);
       (g_pd3dDevice)->SetTexture(0, dymTex);
  //     (g_pd3dDevice)->SetFVF(D3DFVF_CUSTOMPOINT);


// Cuda
	     
	(g_pd3dDevice)->SetRenderState( D3DRS_POINTSPRITEENABLE, TRUE );    // Turn on point sprites
	(g_pd3dDevice)->SetRenderState( D3DRS_POINTSCALEENABLE,  TRUE );    // Allow sprites to be scaled with distance
	float pointsize = 25.0f,
	pointsizemin = 0.1f,
	pointsizemax = 512.0f;
	(g_pd3dDevice)->SetRenderState( D3DRS_POINTSIZE,  *((DWORD*)&pointsize) );
	(g_pd3dDevice)->SetRenderState( D3DRS_POINTSIZE_MIN,  *((DWORD*)&pointsizemin) );
	(g_pd3dDevice)->SetRenderState( D3DRS_POINTSIZE_MAX,  *((DWORD*)&pointsizemax) );
	float A = 0.0f, //współczynnik stały
	B = 0.0f, //liniowy
	C = 1.0f; //kwadratowy
	(g_pd3dDevice)->SetRenderState( D3DRS_POINTSCALE_A,  *((DWORD*)&A) );
	(g_pd3dDevice)->SetRenderState( D3DRS_POINTSCALE_B,  *((DWORD*)&B) );
	(g_pd3dDevice)->SetRenderState( D3DRS_POINTSCALE_C,  *((DWORD*)&C) );

	
	for(int i = 0; i<18; i++)
	{ 
	//	czasteczki[i].Randomuj();
		czasteczki[i].Rysuj();
	}
       (g_pd3dDevice)->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
	   (g_pd3dDevice)->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
 
 }
  //#############################################################################################################
//#############################################################################################################
 //#############################################################################################################
//#############################################################################################################